/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Gestiongrupo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import gestionJDBC.*;
import Gestionequipo.*;
import Gestioncategorias.*;
import java.util.Date;
import java.text.*;
/**
 *
 * @author Adrian
 */
public class GrupoDB {
    
    /**
 * Permite convertir un String en fecha (Date). 
 * @param fecha (String) la fecha a la cual deseo convertir
 * @return Date la fecha en formato Date
 * @author Argenis R.
 */
 
    public Date DeStringADate(String fecha){
        
        SimpleDateFormat formato= new SimpleDateFormat("dd/MM/yyyy");
        String strFecha = fecha;
        Date fechaDate = null;
        
        try {
            
            fechaDate = formato.parse(strFecha);
            return fechaDate;
        
        } catch (ParseException ex) {
            
            ex.printStackTrace();
            return fechaDate;

        }
        
    }
    
     private static gestorJDBC gestor = gestorJDBC.getInstance();
     
     public ArrayList <Grupo> buscaGrupo(String nombre, Categoria c){
         
            ArrayList <Grupo> gr = new ArrayList<Grupo>();
         
            gestor.Conectar();
            
            ResultSet rs = null;
            ResultSet rs2 = null;
            
            //Tipo(id_grupo, id_categoria):
            rs = gestor.Consultar("SELECT grupo.id_grupo,grupo.nombre from grupo, tipo where grupo.nombre ='" + nombre 
                                    +" ' and tipo.id_categoria="+c.GetId()+ " and id.grupo=tipo.id_grupo");
            
            int i = 0;
    
            try{
                
                while(rs.next()){
                    
                    gr.add(new Grupo());
                    gr.get(i).SetId((Integer)rs.getObject("id_grupo"));
                    gr.get(i).SetNombre(rs.getObject("nombre").toString());
                    
                    rs2 = gestor.Consultar("SELECT equipo.id_equipo,equipo.nombre from agrupado,equipo where "
                                            + " equipo.id_equipo=agrupado.id_equipo and agrupado.id_grupo=" + gr.get(i).GetId());
                    
                    try{
                        
                      
                        while(rs2.next()){
                            
                            Equipo eq = new Equipo();
                            
                            eq.SetId((Integer)rs.getObject("id_equipo"));
                            eq.SetNombre(rs.getObject("nombre").toString());
                            
                            gr.get(i).SetEquipo(eq);
                            
                        }
                    
                    }catch(SQLException e ){
                        
                                JOptionPane.showMessageDialog(null,"Error al obtener los equipos de un grupo\n"
                                + e.getMessage());
                    }

                    i++;
                
                }
                

            }catch(SQLException e ){
                JOptionPane.showMessageDialog(null,"Error al obtener los grupos\n"
                                + e.getMessage());
            }
            
            gestor.Desconectar();
            
            return gr;
         
     }
   
     public boolean inscribeEquipoFundación(Integer ide, Integer idg){
         
         
            boolean confirmacion;
        
            gestor.Conectar();
            
            //Agrupado(id_equipo, id_grupo, valido):
            
            confirmacion = gestor.Insertar("INSERT INTO agrupado (id_equipo,id_grupo,valido) "
                                            + "VALUES ("+ ide + "," 
                                            + idg + ", 1)");
            
            gestor.Desconectar();
        
            return confirmacion;
     
     }

     public boolean inscribeEquipo(Integer ide , Integer idg){
         
            boolean confirmacion;
        
            gestor.Conectar();
            
            //Agrupado(id_equipo, id_grupo, valido):
            
            confirmacion = gestor.Insertar("INSERT INTO agrupado (id_equipo,id_grupo,valido) "
                                            + "VALUES ("+ ide + "," 
                                            + idg + ", 1)");
            
            gestor.Desconectar();
        
            return confirmacion;
         
         
     }
     
     public boolean darBajaEquipo(Integer ide, Integer idg){
         
        boolean confirmacion;
        
        gestor.Conectar();
            
        //Agrupado(id_equipo, id_grupo, valido):
            
        confirmacion = gestor.Modificar("UPDATE agregado SET valido=0 WHERE id_equipo="+ ide + "and id_grupo=" +idg);
            
        gestor.Desconectar();
        
        return confirmacion;
         
     }
     
     
     public boolean modificaGrupo(Integer idg,String nombre,Integer idc){
         
         boolean confirmacion;
        
        gestor.Conectar();
            
        //Agrupado(id_equipo, id_grupo, valido):
            
        confirmacion = gestor.Modificar("UPDATE grupo SET nombre='"+ nombre+ "' WHERE id_grupo="+ idg);
        
        if(confirmacion){
            
            confirmacion = gestor.Modificar("UPDATE tipo SET nombre='"+ nombre+ "' WHERE id_grupo="+ idg);

        }
            
        gestor.Desconectar();
        
        return confirmacion;
         
     }

     public boolean creaGrupo(Grupo g, Integer id_categoria){
         
          boolean confirmacion;
          Integer id;
          id = 0;
        
          gestor.Conectar();
            
          //Arupado(id_equipo, id_grupo, valido):
            
          confirmacion = gestor.Insertar("INSERT INTO grupo (nombre) "
                                            + "VALUES ('"+ g.GetNombre() +"')");
         
          
          if(confirmacion){
              
            /* Consultamos el maximo id de los equipos que se encuentra en la fundacion */
            ResultSet rs2 =gestor.Consultar("SELECT max(id_grupo) AS max_grupo FROM grupo");
            
          
            try {

                rs2.next();
                id=(Integer)rs2.getObject("max_grupo");

            } catch (SQLException e) {
                
                
                id = -1;

                JOptionPane.showMessageDialog(null, "Fallo al intentar conseguir el id del nuevo grupo\n"+e.getMessage());
            }
          
          }
          
          if(confirmacion==true && id!=-1){
              
              
              confirmacion = gestor.Insertar("INSERT INTO tipo (id_grupo,id_categoria) "
                                            + "VALUES ("+id+","+ id_categoria + ")");
          }
            
          return confirmacion;
     }

     public boolean compruebaJugadoresValidos(Equipo eq, Grupo g){
         
            gestor.Conectar();
            
            ResultSet rs = null;
            
            Categoria c = new Categoria();

            
            //Tipo(id_grupo, id_categoria):
            rs = gestor.Consultar("SELECT c.id_categoria,c.nombre,c.sexo,c.edad_maxima,c.edad_minima from"
                                    + " categoria c ,agrupado a where c.id_categoria = a.id_categoria and "
                                    + "a.id_grupo=" + g.GetId()); 
         
            //Categoría (id_categoria, nombre, sexo, edad_maxima, edad_minima
            
            try{
                        
                      
                while(rs.next()){
                    
                    c.SetId((Integer) rs.getObject("id_categoria"));
                    c.SetNombre(rs.getObject("nombre").toString());
                    c.SetSexo(rs.getObject("sexo").toString());
                    c.SetEdadMaxima((Integer) rs.getObject("edad_maxima"));
                    c.SetEdadMinima((Integer) rs.getObject("edad_minima"));

                }
                    
            }catch(SQLException e ){

                        JOptionPane.showMessageDialog(null,"Error al obtener los equipos de un grupo\n"
                        + e.getMessage());
            }
            
        
            for(int i=0;i<eq.GetTamanio();i++){
                             
                if((c.GetSexo()).equals((eq.GetJugador(i)).getSexo())){
             
                
                    return false;
                }
                
                Date nacimiento = DeStringADate((eq.GetJugador(i)).getFecha_nacimiento());
                
                /* Supuestamente esto nos da la fecha actual */
                Date fecha_actual = new Date();
                
                Integer actual = fecha_actual.getYear();
                Integer nac = nacimiento.getYear();
                
                int edad_jugador = actual-nac;
                                
                if(edad_jugador > (c.GetEdadMaxima()) || edad_jugador < (c.GetEdadMinima())){
                    
                    return false;
                    
                }
         
            
            }
            
            gestor.Desconectar();
            
            return true;
         
     }


}

